<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    /*
    对于每个点，我们遍历以它结尾的订单，即可得到到这个点最多可赚多少
  i 代表当前结尾  遍历每个end为i的订单 start为该订单的起始点 value为该订单赚多少钱
  $maxV[end] = max(maxV[end],maxV[start]+value);
    */
    var maxTaxiEarnings = function (n, rides) {
      let map = new Map();
      //处理rides以end为key分组
      rides = rides.map((e, index) => {
        if (map.has(e[1])) {
          //has () 返回一个bool值，用来表明map 中是否存在指定元素.
          map.get(e[1]).push(index);
        } else {
          // get 返回指定的元素
          map.set(e[1], [index]);
        }
        // set 为 Map 对象添加或更新一个指定了键（ key ）和值（ value ）的（新）键值对。
        return [e[0], e[1] - e[0] + e[2]];
      });
      //动态规划数组
      let maxV = new Array(n + 1).fill(0);
      //对于每个点，我们遍历以它结尾的订单，即可得到到这个点最多可赚多少
      //i 代表当前结尾  遍历每个end为i的订单 start为该订单的起始点 value为该订单赚多少钱
      //maxV[end] = max(maxV[end],maxV[start]+value);
      for (let end = 1; end <= n; end++) {
        maxV[end] = maxV[end - 1];
        let endAtHere = map.has(end) ? map.get(end) : [];
        for (let index of endAtHere) {
          let start = rides[index][0];
          let value = rides[index][1];
          maxV[end] = Math.max(maxV[end], maxV[start] + value);
        }
      }
      return maxV[n];
    };
    console.log(maxTaxiEarnings(n = 5, rides = [[2, 5, 4], [1, 5, 1]]))
  </script>
</body>

</html>